package com.cross.core;

import java.util.List;
import java.util.ArrayList;

import com.cross.core.Item;
import com.cross.util.Constant;

/**
 * 行对象
 * 
 * 2009-5-11
 * 
 * @author craziness_stone
 */
public final class Row implements Cloneable {

	// 行中的元数据列表
	private List<Item> itemList = new ArrayList<Item>(Constant.DEFAULT_ROWSIZE);
	// 子行对象列表
	private List<Row> subRows = new ArrayList<Row>(Constant.DEFAULT_SUBROWSIZE);
	// 行号
	private long number;

	/**
	 * 构造方法
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 */
	public Row() {

	}

	/**
	 * 将元数据加入行尾
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @param item
	 * @return
	 */
	public int append(Item item) {
		itemList.add(item);
		return itemList.size();
	}

	/**
	 * 获得该行的第column列中的数据元
	 * 
	 * 2009-2-4
	 * 
	 * @author craziness_stone
	 * @param index
	 * @return
	 */
	public Item getItem(long index) {
		if (index < 0) {
			return null;
		}
		if (index >= itemList.size()) {
			return null;
		}
		return itemList.get((int) index);
	}

	/**
	 * 将数据元加入到指定列
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @param index
	 * @param item
	 * @return
	 */
	public int insert(int index, Item item) {
		itemList.add(index, item);
		return index;
	}

	/**
	 * 判断行中所有元数据是否都为空
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @return
	 */
	public boolean empty() {
		for (Item i : itemList) {
			if (!i.empty()) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 获得行中数据元的个数
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @return
	 */
	public int size() {
		return itemList.size();
	}

	/**
	 * 获得数据元列表
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @return
	 */
	public List<Item> getItems() {
		return itemList;
	}

	/**
	 * 获得指定列上的数据元
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @param number
	 * @return
	 */
	public Item getItem(int number) {
		if (number > itemList.size()) {
			return null;
		}
		return itemList.get(number);
	}

	/**
	 * 获得行号
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @return
	 */
	public long getNumber() {
		return number;
	}

	/**
	 * 获得子行对象列表
	 * 
	 * Mar 8, 2009
	 * 
	 * @author craziness_stone
	 * @return
	 */
	public List<Row> getSubRows() {
		return subRows;
	}

	/**
	 * 设置子行对象列表
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @param subRows
	 */
	public void setSubRows(List<Row> subRows) {
		this.subRows = subRows;
	}

	/**
	 * 加入子行
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @param subRow
	 */
	public void addSubRow(Row subRow) {
		this.subRows.add(subRow);
	}

	/**
	 * 将行数据元转化为一个字符串
	 * 
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @return
	 */
	public String toString() {
		if (itemList == null) {
			return null;
		}
		StringBuffer sb = new StringBuffer();
		for (Item item : itemList) {
			sb.append(item.getString() + ",");
		}
		return sb.toString();
	}

	/**
	 * 克隆方法
	 * 
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone
	 * @return
	 */
	public Row clone() {
		Row r = new Row();
		r.setNumber(this.getNumber());
		for (Item i : itemList) {
			r.append(i.clone());
		}
		for (Row sr : subRows) {
			r.addSubRow(sr.clone());
		}
		return r;
	}

	/**
	 * 设置行号
	 * 
	 * 2009-5-11
	 * 
	 * @author craziness_stone cc
	 * @param number
	 */
	public void setNumber(long number) {
		this.number = number;
	}
}